﻿using System;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace sy2_12
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // 1. 自定义函数：生成单个红包金额（参考文档1-218至1-225源码分析）
        // total：引用传递的剩余红包总金额，n：剩余红包个数
        private double getPacket(ref double total, int n)
        {
            double thisPacket; // 当前红包金额
            // 若只剩1个红包，直接分配剩余所有金额
            if (n == 1)
            {
                thisPacket = total;
            }
            else
            {
                Random rnd = new Random();
                // 计算剩余金额的平均值（精确到分）
                double avg = Math.Round(total / n, 2);
                // 在[0.5*avg, 1.5*avg]范围内生成随机金额（文档1-220公式）
                thisPacket = avg / 2 + avg * rnd.Next(101) / 100;
                // 红包金额精确到分
                thisPacket = Math.Round(thisPacket, 2);
            }
            // 更新剩余总金额（扣减当前红包后精确到分）
            total -= thisPacket;
            total = Math.Round(total, 2);
            return thisPacket;
        }

        // 2. 自定义函数：计算红包数组总金额（校验用，文档1-224）
        private double sumPacket(double[] a)
        {
            double sum = 0;
            // 遍历数组累加所有红包金额
            foreach (double m in a)
            {
                sum += m;
            }
            // 总金额精确到分
            return Math.Round(sum, 2);
        }

        // 3. “分发红包”按钮点击事件（文档1-228代码窗口逻辑）
        private void button1_Click(object sender, EventArgs e)
        {
            // 转换用户输入的红包总金额和个数（文档1-228）
            double total = Convert.ToDouble(textBox1.Text);
            int n = int.Parse(textBox2.Text);
            // 定义数组存储所有红包金额
            double[] redPacket = new double[n];
            // 临时变量存储初始总金额（避免修改原始输入值）
            double remainingTotal = total;

            // 循环生成每个红包（从n个到1个依次分配）
            for (int i = n; i > 0; i--)
            {
                // 调用getPacket函数生成红包，存入数组
                redPacket[n - i] = getPacket(ref remainingTotal, i);
            }

            // 显示红包分配结果（用\t分隔实现对齐，参考文档1-228）
            textBox3.Text = string.Join("\t", redPacket);
            // 计算并显示红包总金额（校验是否与输入一致）
            textBox4.Text = sumPacket(redPacket).ToString("F2");
        }
    }
}